/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package conceitos.controle;

import conceitos.DAO.PersonagemDAO;
import conceitos.modelo.entidades.Personagem;
import conceitos.modelo.interfaces.PersonagemRemote;
import conceitosgame.util.Conversoes;
import conceitosgame.util.Corpo;
import conceitosgame.util.DesenharImagem;
import conceitosgame.util.FormatoBmp;
import conceitosgame.util.PartesCorpo;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author jeferson
 */
public class PersonagemControle implements PersonagemRemote{

    private PartesCorpo cabelo;
    private Corpo corpo;
    private PartesCorpo rosto;
    private PartesCorpo roupa;
    private Color corCabelo;
    private Color corCorpo;
    private Color corRosto;
    private Color corRoupa[];
    private FormatoBmp imagemPersonagem;
    private Personagem personagem;
    private PersonagemDAO personagemDAO;

    public PersonagemControle() {
        cabelo = new PartesCorpo();
        corpo = new Corpo();
        rosto = new PartesCorpo();
        roupa = new PartesCorpo();
        corCabelo = new Color(0, 0, 0);
        corCorpo = new Color(0, 0, 0);
        corRosto = new Color(0, 0, 0);
        corRoupa = new Color[2];
        imagemPersonagem = new FormatoBmp();
        personagem = new Personagem();
        personagemDAO = new PersonagemDAO();
    }
    
    @Override
    public void insert(Personagem personagem) {
        personagemDAO.insert(personagem);
    }

    @Override
    public void delete(Personagem personagem) {
        personagemDAO.delete(personagem.getIdConta());
    }

    @Override
    public Personagem select(String filtro) {
        return personagemDAO.select(filtro);
    }

    public PartesCorpo getCabelo() {
        return cabelo;
    }

    public void setCabelo(PartesCorpo cabelo) {
        this.cabelo = cabelo;
    }

    public Color getCorCabelo() {
        return corCabelo;
    }

    public void setCorCabelo(Color corCabelo) {
        this.corCabelo = new Color(corCabelo.getRed(), corCabelo.getGreen(), corCabelo.getBlue());
    }

    public Color getCorCorpo() {
        return corCorpo;
    }

    public void setCorCorpo(Color corCorpo) {
        this.corCorpo = corCorpo;
    }

    public Color getCorRosto() {
        return corRosto;
    }

    public void setCorRosto(Color corRosto) {
        this.corRosto = corRosto;
    }

    public Color[] getCorRoupa() {
        return corRoupa;
    }

    public void setCorRoupa(Color corRoupa[]) {
        this.corRoupa = corRoupa;
    }

    public Corpo getCorpo() {
        return corpo;
    }

    public void setCorpo(Corpo corpo) {
        this.corpo = new Corpo();
        this.corpo = corpo;
    }

    public PartesCorpo getRosto() {
        return rosto;
    }

    public void setRosto(PartesCorpo rosto) {
        this.rosto = rosto;
    }

    public PartesCorpo getRoupa() {
        return roupa;
    }

    public void setRoupa(PartesCorpo roupa) {
        this.roupa = roupa;
    }

    public BufferedImage construirImagem() {
        DesenharImagem desenharImagem = new DesenharImagem();
        FormatoBmp temp = new FormatoBmp();
        temp = desenharImagem.composicao(corpo.getCorpo(), rosto.getImagemAmpliada());
        temp = desenharImagem.composicao(temp, roupa.getImagemAmpliada());
        temp = desenharImagem.composicao(temp, cabelo.getImagemAmpliada());
        this.imagemPersonagem = temp;
        return desenharImagem.definirBufferedImage(temp);
    }

    public void mudarCorOlhos(Color cor) {
        DesenharImagem pintor = new DesenharImagem();
        int[][] mascaraOlhos = pintor.obterMascaraPintura(rosto.getImagemAmpliada(), this.corRosto);
        rosto.setImagemAmpliada(pintor.colorir(mascaraOlhos, rosto.getImagemAmpliada(), cor, 1));
    }

    public void mudarCorCabelo(Color cor) {
        DesenharImagem pintor = new DesenharImagem();
        int[][] mascaraCabelo = pintor.obterMascaraPintura(cabelo.getImagemAmpliada(), this.corCabelo);
        cabelo.setImagemAmpliada(pintor.colorir(mascaraCabelo, cabelo.getImagemAmpliada(), cor, 2));
    }

    public void mudarCorRoupa(Color cor1, Color cor2) {
        DesenharImagem pintor = new DesenharImagem();
        int[][] mascaraRoupa1 = pintor.obterMascaraPintura(roupa.getImagemAmpliada(), this.corRoupa[0]);
        int[][] mascaraRoupa2 = pintor.obterMascaraPintura(roupa.getImagemAmpliada(), this.corRoupa[1]);
        PartesCorpo novo = new PartesCorpo();
        novo.getImagemAmpliada().copiarBmp(roupa.getImagemAmpliada());
        novo.setImagemAmpliada(pintor.colorir(mascaraRoupa1, roupa.getImagemAmpliada(), cor1, 3));
        roupa.setImagemAmpliada(pintor.colorir(mascaraRoupa2, novo.getImagemAmpliada(), cor2, 4));
    }

    public void mudarCorCorpo(Color cor) {
        DesenharImagem pintor = new DesenharImagem();
        int[][] mascaraCorpo = pintor.obterMascaraPintura(corpo.getCorpo(), this.corCorpo);
        corpo.setCorpo(pintor.colorir(mascaraCorpo, corpo.getCorpo(), cor, 5));
    }

    public FormatoBmp mudarCorImagem(Color cor, Color antiga, FormatoBmp imagem, int tipo) {
        DesenharImagem pintor = new DesenharImagem();
        int[][] mascara = pintor.obterMascaraPintura(imagem, antiga);
        return pintor.colorir(mascara, imagem, cor, tipo);
    }

    public FormatoBmp getImagemPersonagem() {
        return imagemPersonagem;
    }

    public Personagem getPersonagem() {
        return personagem;
    }

    public void setPersonagem(Personagem personagem) {
        this.personagem = personagem;
    }
    
    public void gerarPersonagemPNG(int idPersonagem) throws IOException{
        personagem = new Personagem();
        personagemDAO = new PersonagemDAO();
        personagem = personagemDAO.select("idpersonagem = "+idPersonagem);
        FormatoBmp formatoBmp = new FormatoBmp();
        formatoBmp = formatoBmp.constuirBmpByteArray(personagem.getImagemPersonagem());
        DesenharImagem imagem = new DesenharImagem();
        BufferedImage novaImagem = imagem.definirBufferedImage(formatoBmp);
        int largura = Conversoes.byteArray2Int4(formatoBmp.BiWidth);
        int altura = Conversoes.byteArray2Int4(formatoBmp.BiHeight);         
        BufferedImage temp = new BufferedImage(largura/2, altura/2, BufferedImage.TYPE_INT_RGB);  
        Graphics2D g = temp.createGraphics();  
        g.drawImage(novaImagem, 0, 0, largura/2, altura/2, null);  
        ImageIO.write(temp, "png", new File("src/assets/Textures/personagem.png"));
    }
    
}
